package com.xuecheng.media.task;

import com.xuecheng.media.config.MinioProperties;
import com.xuecheng.media.model.po.MediaMinioFiles;
import com.xuecheng.media.service.IMediaMinioFilesService;
import io.minio.MinioClient;
import io.minio.RemoveObjectArgs;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author 勾新杰
 * @version 1.0
 * @description 定时清理任务minio中未合并分块文件并且大概率不会上传剩余的分块
 * @date 2025/2/9 12:38
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class ClearUpTask {

    /**
     * 媒体文件service
     */
    private final IMediaMinioFilesService mediaMinioFilesService;

    /**
     * minio客户端
     */
    private final MinioClient minioClient;

    /**
     * minio配置
     */
    private final MinioProperties minioProperties;

    /**
     * 清理分块文件
     */
    @Scheduled(cron = "0 * * * * ?") // 午夜12点
    @Transactional(rollbackFor = RuntimeException.class) // 只对于数据库
    public void clearUpChunks() {
        // 1. 查询长时间未合并的分块文件并且没有上传相关的新的分块文件
        List<MediaMinioFiles> unMergeChunks = mediaMinioFilesService.searchUnMergeChunks();
        for (MediaMinioFiles chunk : unMergeChunks) {
            // 2. 数据库删除分块文件
            mediaMinioFilesService.removeById(chunk);
            // 3. minio删除分块文件
            try {
                minioClient.removeObject(
                        RemoveObjectArgs.builder()
                                .bucket(minioProperties.getBucket().getVideoFiles())
                                .object(chunk.getChunkPath())
                                .build()
                );
            } catch (Exception e) {
                log.error("清理分块文件失败:{}", e.getMessage());
                throw new RuntimeException(e);
            }
        }
    }
}
